using System;
using System.Collections.Generic;
using M0;
using M1;
using UnityEngine;
using UnityEngine.UI;

namespace Demo
{
    public class Comp任务Item : MonoBehaviour
    {
        [SerializeField] private List<Image> 奖励Icon;
        [SerializeField] private List<Text> 奖励数量;
        [SerializeField] private Text 任务进度;
        [SerializeField] private Image 任务可领取;
        [SerializeField] private List<Image> title;
        [SerializeField] private Slider 进度条;
        [SerializeField] private GameObject 已领取;
        [SerializeField] private GameObject 未解锁;

        [SerializeField] private GameObject 补领视频按钮;
        // [SerializeField]private Slider 进度条;

        奖励类型 奖励Type;
        任务类型 任务类型;
        int n奖励数量;
        int RewardType;
        private Action<任务类型> 跳转方法;
        private bool 是否可以领奖;
        private bool 是否已领取;
        private int 任务Id;
        public string 奖励来源;

        public void SetUp(任务所需整合 data, Action<任务类型> call)
        {
            foreach (var VARIABLE in 奖励Icon)
            {
                VARIABLE.sprite = data.奖励Icon;
            }

            foreach (var VARIABLE in title)
            {
                VARIABLE.sprite = data.titleIcon;
            }

            foreach (var VARIABLE in 奖励数量)
            {
                VARIABLE.text = $"x{data.奖励数量}";
            }


            n奖励数量 = data.奖励数量;


            if (任务进度 != null)
            {
                var 限制进度 = Math.Min(data.进度, data.target);
                任务进度.text = $"{限制进度}/{data.target}";
            }



            是否已领取 = data.是否已领取;
            bool 可领取 = data.进度 >= data.target;
            是否可以领奖 = 可领取;
            领奖情况();

            if (进度条 != null)
            {
                进度条.value = (data.进度 + 0f) / data.target;
            }

            奖励Type = data.奖励Type;
            RewardType = data.RewardType;
            任务类型 = data.任务类型;
            跳转方法 = call;
            任务Id = data.Id;

        }

        private void 领奖情况()
        {
            未解锁.gameObject.SetActive(!是否已领取 && !是否可以领奖);
            任务可领取.gameObject.SetActive(!是否已领取 && 是否可以领奖);
            已领取.gameObject.SetActive(是否已领取);
        }

        public void 领取奖励或前往()
        {
            if (是否已领取) return;


            if (是否可以领奖)
            {
                var model = 任务配置.Instance;
                领取奖励(奖励Type, RewardType, n奖励数量);
                Task管理器.Instance.领奖奖励(任务Id);

                是否已领取 = true;
                领奖情况();


                int 动画数量 = 1;
                if (奖励Type == 奖励类型.金币)
                {
                    动画数量 = 3;
                }


                (Transform, GameObject) 动画目的地;
                动画目的地 = 准备界面.Get动画目的地(奖励Type);

                // if (哪个商店 == "商店" && 奖励Type == 奖励类型.金币)
                // {
                //     var w = Manager窗户管理器.Instance.GetWindow<商店>();
                //     动画目的地 = w.Get金币目的地();
                // }
                // else
                // {
                //     动画目的地 = 准备界面.Get动画目的地(奖励Type);
                // }
                List<Image> list动画数量 = new List<Image>();
                for (int i = 0; i < 动画数量; i++)
                {
                    list动画数量.Add(奖励Icon[0]);
                }

                获得奖励动画.Instance.SetUpPlay动画(奖励Icon[0].transform, 动画目的地.Item1, 动画目的地.Item2, list动画数量, null, 更新显示数据);


                if (!string.IsNullOrEmpty(奖励来源))
                {
                    Dictionary<string, object> 打点 = new Dictionary<string, object>();
                    打点.Add("type", "GetReward");
                    打点.Add("Id", 任务Id);
                    M打点.Instance.第三方打点Help[1].特殊打点(奖励来源, 打点);
                }
            }
            else
            {
                //前往
                跳转方法?.Invoke(任务类型);
            }
        }

        private void 更新显示数据()
        {
            var 准备界面 = Manager窗户管理器.Instance.GetWindow<游戏准备界面>();
            准备界面.跟新显示数据(奖励Type);
        }

        public void SetUp七日签到(任务所需整合 config, Action<任务类型> call, int item第几天, int 实际第几天)
        {
            SetUp(config, call);

            未解锁.gameObject.SetActive(!是否已领取 && item第几天 > 实际第几天);
            任务可领取.gameObject.SetActive(!是否已领取 && item第几天 <= 实际第几天);
            // 已领取.gameObject.SetActive(是否已领取);
            补领视频按钮.SetActive(!是否可以领奖);


        }

        public void 可以补领的领取()
        {
            if (是否可以领奖)
            {
                领取奖励或前往();
            }
            else
            {

                var 小游戏 = Launch.Instance.GetCur小游戏;
                小游戏.Play播放广告("补领任务", 播放广告时限.一次性, () =>
                {
                    // 任务系统.Instance.添加任务进度(任务类型.登入游戏.ToString(),1);

                    M打点.Instance.单项打点(实丰枚举.video.ToString(), 实丰打点值.signature.ToString(), -1);
                    var u = Manager数据管理器.Instance.Get临时数据<User>("User") as User;
                    M打点.Instance.单项打点(实丰枚举.pay.ToString(), 实丰打点值.signature_.ToString(), u.GetCurLevel(Enum关卡类型.新闯关));
                    bool 之前可以吗 = 是否可以领奖;
                    是否可以领奖 = true;
                    领取奖励或前往();
                    是否可以领奖 = 之前可以吗;
                });
            }
        }

        public void 领取奖励(奖励类型 奖励Type, int rewardType, int n奖励数量)
        {
            缓存User.Instance.加货币(n奖励数量, 奖励Type.ToString(), true);
            //TODO 服务器加金币
            //TODO 服务器加技能
        }
    }

    public class 任务所需整合
    {
        public Sprite titleIcon;
        public Sprite 奖励Icon;
        public int target;
        public int 进度;
        public int 奖励数量;
        public int RewardType;
        public 奖励类型 奖励Type;
        public 任务类型 任务类型;
        public bool 是否已领取;
        public int Id;
    }

    public enum 奖励类型
    {
        闯关技能,
        挑战技能,
        金币,
        体力,
        第七日礼包,
    }

    public enum 任务类型
    {
        登入游戏,
        通关关卡,
        匹配麻将,
        使用道具,
        观看视频,
        分享,
        在线,
        签到,
    }

}

